// 函子 
// 是一个具有map方法打的容器（普通的对象），容器内维护一个不对外公布值，只有map方法传入函数对值进行处理，运行完后返回一个新得函子。

// class Container {
//     constructor (value) {
//         this._value = value  //定义带_都是内部变量
//     }
//     map(fn) {
//         return new Container(fn(this._value))
//     }
// }

// const f = new Container(5).map(x => x + 1)
    
// console.log(f)


// 改进

class Container {
    constructor (value) {
        this._value = value  //定义带_都是内部变量
    }
    static f (value) {
        return new Container(value)
    }
    map(fn) {
        return Container.f(fn(this._value))
    }
}

// const r = Container.f(5).map(x => x * x)

// console.log(r._value)


// 如果不小心传入null
const r = Container.f(null).map(x => x.toUpperCase())
console.log(r)
// 这里就会报错，这就是副作用


// 总结函子
// 函数式编程的运算不直接操作值，而是由函子完成
// 函子就是实现了map契约的对象（每一个函子都有一个map方法）
// 函子想想为一个盒子，每一个盒子封装一个值
// 想要处理那个值，只需要给盒子的map方法传递一个处理值得函数（纯函数）由这个函数都值经行处理
// 最终map方法返回一个包含新值得盒子（函子）
